package ai

import (
	"anders-cli/internal/config"
	"anders-cli/pkg/logger"
	"fmt"
)

// Backend AI后端接口
type Backend interface {
	Query(prompt string, tools []Tool) (string, error)
	Name() string
	GetModel() string
}

// Tool 工具定义（OpenAI兼容格式）
type Tool struct {
	Type     string `json:"type"`
	Function struct {
		Name        string                 `json:"name"`
		Description string                 `json:"description"`
		Parameters  map[string]interface{} `json:"parameters"`
	} `json:"function"`
}

// QueryRequest 查询请求
type QueryRequest struct {
	Model    string    `json:"model"`
	Messages []Message `json:"messages"`
	Tools    []Tool    `json:"tools,omitempty"`
}

// Message 消息结构
type Message struct {
	Role    string `json:"role"`
	Content string `json:"content"`
}

// NewBackend 根据配置创建对应的AI后端
func NewBackend() (Backend, error) {
	cfg := config.Get()

	switch cfg.General.DefaultBackend {
	case "ollama":
		logger.Info("使用 Ollama 后端")
		return NewOllamaBackend(), nil
	case "lmstudio":
		logger.Info("使用 LMStudio 后端")
		return NewLMStudioBackend(), nil
	case "xai":
		logger.Info("使用 xAI 后端")
		return NewXAIBackend(), nil
	default:
		return nil, fmt.Errorf("不支持的后端类型: %s", cfg.General.DefaultBackend)
	}
}

// GetAvailableBackends 获取所有可用的后端列表
func GetAvailableBackends() []string {
	return []string{"ollama", "lmstudio", "xai"}
}

// ValidateBackend 验证后端配置是否有效
func ValidateBackend(backendName string) error {
	available := GetAvailableBackends()
	for _, b := range available {
		if b == backendName {
			return nil
		}
	}
	return fmt.Errorf("不支持的后端类型: %s，可用后端: %v", backendName, available)
}
